using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TitanX;
using System;
using DG.Tweening;

//主控类
public class Controller : SingletonGetMono<Controller>
{
    [Header("需要进行视角控制的tag")]
    public string[] needVisualTags;

    private void Start()
    {

      
        //视角总控制
        foreach (string tag in needVisualTags)
        {
            GameObject[] gmList = GameObject.FindGameObjectsWithTag(tag);
            foreach (GameObject gm in gmList)
            {
                gm.transform.rotation = Camera.main.transform.rotation;
            }

            GameManger.Round round = GameManger.Instance.round;

            //CreateMap();
        }

        Invoke("CreateMap", 1f);
     
    }


    //上一次点击的 方块
    private GameObject oldPreBox;

    public GameObject denseFogMask;

    private Vector2 denseFogSize = new Vector2(0.4486834f, 0.88166f);

    private Vector2 bigDenseFogSize = new Vector2(0.558f, 1.079679f);

    public GameObject unitMapCenter;

    public List<float> noCreateX=new List<float>();
    public List<float> noCreateY=new List<float>();
    public Camera cameraController;
    private RaycastHit raycastHit;//射线信息

    //寻找所有不能创建物体的坐标
    public void findAllNotCreateItem(){
          GameObject[] gmList=GameObject.FindGameObjectsWithTag("resours");
          GameObject[]   obstacleList=GameObject.FindGameObjectsWithTag("obstacle");
   
            foreach(GameObject gm in gmList){
              noCreateX.Add(gm.transform.position.x);
              noCreateY.Add(gm.transform.position.y);
            }

            noCreateX.Add(Player.Instance.transform.position.x);
            noCreateY.Add(Player.Instance.transform.position.y);

    }
    public Vector3 lastMousePosition = Vector3.zero;

    public void clear() {
        oldPreBox = null;
    }

    void Update()
    {
        Ray ray=new Ray();

  

        // Debug.DrawLine(new Vector3(-1.25f,-10.05f,7.56f), Vector3.zero, Color.green, Mathf.Infinity);
        //   Debug.DrawLine(new Vector3(ray.origin.x, ray.origin.y, ray.origin.z), Vector3.zero, Color.green, Mathf.Infinity);
        //两次点击移动的方法
        if (Input.GetMouseButtonDown(0))
        {


            if (GameManger.Instance.handleStart==GameManger.HandleStart.attExcute){
             //   LockingManger.Instance.Hide();
                LockingManger.Instance.isAtt=true;
               
                //说明这个是再攻击的时候
                return;
            }


            //行动点数小于0
          
            RaycastHit hit2;
            Vector3 pos = Input.mousePosition;
            pos.y = 5f; // z:差值
     
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
       
      
            if (Physics.Raycast(ray, out raycastHit))
            {


                Debug.Log("点击的物体："+raycastHit.collider.name);

                if (raycastHit.collider.name.Equals("骰子")) {
                    StartCoroutine(OnMouseDown());
              
                }
                 GameObject preBox = raycastHit.collider.gameObject;
                if (!raycastHit.collider.tag.Equals("preMoveBox")) {

                    return;
                }
                if (GameManger.Instance.actPoint <= 0)
                {
                    return;
                }

                PlayerWaitBox.BoxType preBoxType = preBox.GetComponent<PlayerWaitBox>().boxType;
                if (preBox.GetComponent<PlayerWaitBox>().boxType==PlayerWaitBox.BoxType.ban){
                        //TODO给个弹窗，不许移动到此位置
                         
                        return;
                    }

                //锁定框Locking
                LockingManger.Instance.MovePosition(preBox.transform.position);


                if (preBox.Equals(oldPreBox) && oldPreBox != null)
                {

                    //不一定要消失-如何锁定的是敌人，进入攻击状态

                    if(preBoxType==PlayerWaitBox.BoxType.emeny){

                        LockingManger.Instance.AttLocking(preBox);
                    }else{

                          LockingManger.Instance.Hide();
                          preBox.GetComponent<PlayerWaitBox>().ExecuteCommand();
                    }
                    
                   
                  //  GameManger.Instance.handleStart = GameManger.HandleStart.excute;
        
                    //直接执行 该方块的命令，如何做，再方块里面
                   
                  //  Player.Instance.Move(preBox.transform.localPosition+Player.Instance.transform.position);
                    //减少点数
                }
                oldPreBox = preBox;
            }

        }



       



    }


    //注意世界坐标系转化为屏幕坐标系，Z轴是不变的
    IEnumerator OnMouseDown()
    {


        if (raycastHit.collider != null) {

          
            //将物体由世界坐标系转化为屏幕坐标系，由vector3 结构体变量ScreenSpace存储，以用来明确屏幕坐标系Z轴的位置
            Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(raycastHit.collider.transform.position);
            //完成了两个步骤，1由于鼠标的坐标系是2维的，需要转化成3维的世界坐标系，2只有三维的情况下才能来计算鼠标位置与物体的距离，offset即是距离
            Vector3 offset = raycastHit.collider.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));
            Debug.Log("down");
            //当鼠标左键按下时
            while (Input.GetMouseButton(0))
            {
               // Debug.Log("开222");
                //得到现在鼠标的2维坐标系位置
                Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z);
                //将当前鼠标的2维位置转化成三维的位置，再加上鼠标的移动量
                Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
                //CurPosition就是物体应该的移动向量赋给transform的position属性

                
                raycastHit.collider.transform.position = CurPosition;

                //DiceManger.Instance.updatePwxLine();

               // print(DiceManger.Instance);

                DiceManger.Instance.isMove = true;
                


                yield return new WaitForFixedUpdate();
            }

            //松开手


            if (raycastHit.collider.transform.position.y>-8.3f) {

                //播放动画
                //结束携程

                print("开始抛物线");

                DiceManger.Instance.StartPwx();
                DiceManger.Instance.isMove = false;
               //影子跟随

               
            }



        }


    }



    //解除战争迷雾
    public void RemoveDenseFog(){
        //逻辑不知道，先写好
        //解开最外围区域
        //当玩家移动到最顶的通往点，摄像机位移，开启一个新的局
        //重新生成对象池对象，点数回归，

        //获取当前，边框的大小，解除吧高和宽都增加1点，不就行了，还要生成一个绿的边框

        //当玩家碰到这个边框，摄像机移动，框体改变，开始新的回合，创建地图

        denseFogMask.transform.DOScale(bigDenseFogSize, 0.3f);


    }

     float  centerX;
     float centerY;
    //地图的宽和高
    public int  mapHeight;
    public int  mapWidth;
    public GameObject[] mapCenterPoints;

    public float x;
    public float y;

    //创建一张地图
    public void CreateMap(){
        //需要 -|地板  -|资源  -|敌人  -|障碍   -|地形
        //随机，但是资源不能完全随机，地图的方形的吗？
        //也就是说，我现在要做的是一个新的回合

        //计算的是战争迷雾的大小，这样的话为还是用单元化的处理逻辑，那我需要的还是对象池
        //一张小图，最多二三个敌人 1-2 个物资，障碍，障碍和地形暂不生成，为固定的

        
        findAllNotCreateItem();

        
       // int emenyNum= RangeUtils.RandArr(new int[]{65,35})+2;
        int emenyNum=2;

        int fitfallNum=1;


        PlayerWaitBoxManger.Instance.Show();



        centerX = unitMapCenter.transform.position.x;

         centerY = unitMapCenter.transform.position.y;


        Debug.Log("生成敌人的数量："+emenyNum);
       
           
               for(int i=0;i<fitfallNum;i++){

                   Vector2 v2= availableXy();
                 
                        //再生成每个对象之前，先弄一个出场动画，动画结束，人物登场//
                       GameObject prefab=  PoolManger.Instance.OutPool("pitfall");
                       prefab.transform.position=v2;
                        noCreateX.Add(v2.x);
                       noCreateY.Add(v2.y);
               }



        StartCoroutine(CreateEmeny(emenyNum));

        //创建地图，多读懂稍稍有点问题


        //生成的位置在哪，自动的巡逻点又在哪，

        //首先，我要获取，当前地图的中心点






        // 判断。1。区域内敌人全部被清除，，清除完毕？解锁外围区域
        //不行，还是得先解决敌人对象池的生成物体，不想碰对象池啊


    }





    IEnumerator CreateEmeny(int emenyNum)
    {






        for (int i = 0; i < emenyNum; i++)
        {
            //坏了

            x = centerX + (UnityEngine.Random.Range(-mapWidth, +mapWidth));

            //while()){
            if (noCreateX.Contains(x))
            {
                x = centerX + (UnityEngine.Random.Range(-mapWidth, +mapWidth));
            }

            if (noCreateY.Contains(y))
            {
                y = centerY + (UnityEngine.Random.Range(-mapHeight, +mapHeight));
            }
            //  while(){
            y = centerY + (UnityEngine.Random.Range(-mapHeight, +mapHeight));

          //  Debug.Log("生成物体的范围： （" + x + "," + y + ")");

            //再生成每个对象之前，先弄一个出场动画，动画结束，人物登场//
    

               

            GameObject effectPrefab = PoolManger.Instance.OutPool("effect");
            effectPrefab.transform.position = new Vector2(x, y);
            yield return new WaitForSeconds(0.3f);

            //一个对象一个对象生成
            GameObject prefab = PoolManger.Instance.OutPool("emeny");
            prefab.transform.position = new Vector2(x, y);
           

            noCreateX.Add(x);
            noCreateY.Add(y);


            yield return new WaitForSeconds(0.8f);
        }







      
    
    
    }


    public Vector2 availableXy(){


      
             x=centerX+(UnityEngine.Random.Range(-mapWidth,+mapWidth));

            //while()){
            if(noCreateX.Contains(x)){
                    x=centerX+(UnityEngine.Random.Range(-mapWidth,+mapWidth));
            }

            if(noCreateY.Contains(y)){
                 y= centerY+(UnityEngine.Random.Range(-mapHeight,+mapHeight));
            }
         //  while(){
             y =centerY+(UnityEngine.Random.Range(-mapHeight,+mapHeight));
         return new Vector2(x,y);
                Debug.Log("生成物体的范围： （"+x+","+y+")");
         

    }





}
